Реализация редактирования в не связанной с данными колонке табличного поля

В 1С:Предприятии 8 существует возможность редактировать значения в колонках табличного поля, не связанных с данными. Это позволяет осуществлять редактирование значений, для которых не существует стандартного редактора значения (например, значение типа ХранилищеЗначения) или редактировать  значения в дополнительных колонках в которых, например, вычисляется значение суммы по по какому-либо товару.

Основные принципы реализации редактирования в колонке, не связанной с данными, следующие:

  1. Установить элемент управления в требуемой колонке. Это можно сделать, используя свойство ЭлементУправления колонки табличного поля.
  2. Перед началом редактирования необходимо установить элементу управления редактируемое значение. Это можно сделать, используя событие ПриНачалеРедактирования() табличного поля.
  3. При окончании редактирования новое значение можно получить у элемента управления при обработке события ПриИзменении() данного элемента управления.
  4. Если редактируемое значение должно нестандартно отображаться в табличном поле, то необходимо использовать событие ПриВыводеСтроки() табличного поля.

Поясним реализацию редактирования в колонке, не связанной с данными, на следующем примере. Пусть существует документ ЗаказПокупателя, у которого имеется табличная часть Товары. Один из реквизитов этой табличной части имеет тип ХранилищеЗначения и служит для хранения изображения товара. Требуется осуществлять ввод изображений товаров непосредственно при добавлении новых товаров в табличную часть. Так как для значения типа ХранилищеЗначений не существует стандартного редактора, то и не существует стандартной возможности ввода таких значений в табличное поле. Поэтому, для того чтобы обойти данное ограничение, необходимо программно реализовать ввод значений данного типа. Для этого в табличное поле, отображающее табличную часть, необходимо добавить колонку, в которой будет осуществляться ввод изображений товаров. Пусть это будет колонка Изображение. Свойство Данные данной колонки оставляем незаполненным, а в свойстве ЭлементУправления устанавливаем поле ввода. Также пусть существует элемент управления ПолеКартинки, в котором будет отображаться изображение текущего товара в табличной части.

Для того чтобы осуществлять выбор изображений в данном поле ввода, необходимо включить у него кнопку выбора, используя свойство КнопкаВыбора. При нажатии на эту кнопку необходимо открывать диалог выбора файла, в котором и осуществлять выбор изображения товара. Для этого необходимо обработать событие поля ввода НачалоВыбора. В приведенном ниже фрагменте программы показано как осуществляется выбор изображения, а затем выбранное изображение сохраняется в поле Изображение табличной части. Стоит заметить, что в поле Изображение сохраняется не сама картинка, а структура, содержащая картинку и имя файла. Это сделано для того, чтобы отображать имя файла изображения в табличном поле.

Копировать в буфер обмена
Процедура ТоварыИзображениеНачалоВыбора(Элемент, СтандартнаяОбработка)

    // Выбор изображения товара и сохранение его 
    Перем СтруктураИзображения, Хранилище;

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите изображение...";
    Диалог.Фильтр = "Все файлы (*.*)|*.*|Картинки (*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf)|*.bmp;*.dib;*.rle;*.jpg;*.jpeg;*.tif;*.gif;*.png;*.ico;*.wmf;*.emf";
    Диалог.ПредварительныйПросмотр = Истина;
    Диалог.ПроверятьСуществованиеФайла = Истина;
    Диалог.МножественныйВыбор = Ложь;

    Если Диалог.Выбрать() Тогда

        // Сохраняем полученное изображение товара в структуре вместе
        // с его именем файла.
        СтруктураИзображения = Новый Структура;

        СтруктураИзображения.Вставить("ИмяФайла", Сред(Диалог.ПолноеИмяФайла, СтрДлина(Диалог.Каталог) + 1));
        СтруктураИзображения.Вставить("Картинка", Новый Картинка(СтруктураИзображения.ИмяФайла));

        Хранилище = Новый ХранилищеЗначения(СтруктураИзображения, Новый СжатиеДанных());

        ЭлементыФормы.Товары.ТекущиеДанные.Изображение = Хранилище;

        // Устанавливаем выбранное изображение в поле картинки
        ЭлементыФормы.Изображение.Картинка = СтруктураИзображения.Картинка;

        // Устанавливаем редактору имя файла выбранного изображения
        Элемент.Значение = СтруктураИзображения.ИмяФайла;

    КонецЕсли;

КонецПроцедуры

Для того чтобы при редактировании колонки Изображение поле ввода содержало имя файла изображения текущего товара, необходимо перед началом редактирования принудительно установить ему нужное значение. Для этого необходимо использовать событие ПриНачалеРедактирования() табличного поля:

Копировать в буфер обмена
Процедура ТоварыПриНачалеРедактирования(Элемент, НоваяСтрока)

    // Устанавливаем в редактор значения имя файла редактируемого изображения
    Перем СтруктураИзображения;

    СтруктураИзображения = ЭлементыФормы.Товары.ТекущиеДанные.Изображение.Получить();

    Если СтруктураИзображения <> Неопределено Тогда 

        ЭлементыФормы.Товары.Колонки.Изображение.ЭлементУправления.Значение = СтруктураИзображения.ИмяФайла;

    Иначе 

        ЭлементыФормы.Товары.Колонки.Изображение.ЭлементУправления.Значение = "";

    КонецЕсли;

    УстановитьСвойстваПоляВводаЦены();

КонецПроцедуры

Так как колонка Изображение не связана с данными, то при ее отображении необходимо самому формировать текстовое представление, которое будет отображено в табличном поле. Для этого необходимо использовать событие ПриВыводеСтроки() табличного поля:

Копировать в буфер обмена
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

    Перем СтруктураИзображения;

    // Отображаем имя файла изображения
    СтруктураИзображения = ДанныеСтроки.Изображение.Получить();

    Если СтруктураИзображения <> Неопределено Тогда

        ОформлениеСтроки.Ячейки.Изображение.УстановитьТекст(СтруктураИзображения.ИмяФайла);

    КонецЕсли;

КонецПроцедуры

Для того чтобы изображение текущего товара отображалось в поле картинки, необходимо использовать событие ПриАктивизацииСтроки() табличного поля:

Копировать в буфер обмена
Процедура ТоварыПриАктивизацииСтроки(Элемент)

    // Установка изображения текущего товара в поле картинки
    Перем СтруктураИзображения;

    СтруктураИзображения = ЭлементыФормы.Товары.ТекущиеДанные.Изображение.Получить();

    Если СтруктураИзображения <> Неопределено Тогда 

        ЭлементыФормы.Изображение.Картинка = СтруктураИзображения.Картинка;

    Иначе 

        ЭлементыФормы.Изображение.Картинка = Новый Картинка();

    КонецЕсли;

КонецПроцедуры

Отметим, что данный пример приведен для иллюстрации возможностей редактирования в колонках табличного поля, не связанных с данными.